package com.lilosoft.core.base;

import java.util.HashMap;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baomidou.mybatisplus.plugins.Page;
import com.lilosoft.core.result.JsonResult;
import com.lilosoft.core.result.PageInfoBT;
import com.lilosoft.core.utils.HttpUtil;
import com.lilosoft.core.utils.commons.StringUtils;

/**
 * controller基类
 *
 * @author qiusheng
 * @Date 2018-10-30
 */
public abstract class BaseController {

	protected static String SUCCESS = "SUCCESS";
    protected static String ERROR = "ERROR";

    protected static String REDIRECT = "redirect:";
    protected static String FORWARD = "forward:";

    public static String BASE_PREFIX = "/common/base/";

	/**
	 * 日志对象
	 */
	public Logger logger = LoggerFactory.getLogger(getClass());

	/**
	 * 当前项目物理路径
	 */
	public static String realpath = "";

	public enum HttpErrCode {
		/**
		 * （未登录授权） 请求要求身份登录验证
		 */
		ERR_401(401, "（未登录授权） 请求要求身份登录验证"),

		/**
		 * （禁止） 即使有登录授权，无应用访问权限，服务器拒绝请求。
		 */
		ERR_403(403, "（禁止） 即使有登录授权，无应用访问权限，服务器拒绝请求。");

		private Integer code;
		private String msg;

		private HttpErrCode(Integer code,String msg) {
			this.code = code;
			this.msg = msg;
		}

		public Integer getCode() {
			return code;
		}

		public String getMsg() {
			return msg;
		}
	}

	protected HttpServletRequest getHttpServletRequest() {
        return HttpUtil.getRequest();
    }

    protected HttpServletResponse getHttpServletResponse() {
        return HttpUtil.getResponse();
    }

    protected HttpSession getSession() {
        return HttpUtil.getRequest().getSession();
    }

    protected HttpSession getSession(Boolean flag) {
        return HttpUtil.getRequest().getSession(flag);
    }

    protected String getPara(String name) {
        return HttpUtil.getRequest().getParameter(name);
    }

    protected void setAttr(String name, Object value) {
    	HttpUtil.getRequest().setAttribute(name, value);
    }

    /**
     * 读取指定cookie，若不存在则设置cookie的默认值
     * @param name
     * @param value
     * @return
     */
	protected String getCookie(String name, String value) {
		Cookie[] cookies = HttpUtil.getRequest().getCookies();

		String result = "";
		if (cookies != null && StringUtils.isNotEmpty(name)) {
			for (Cookie cookie : cookies) {
				if (name.equals(cookie.getName())) {
					result = cookie.getValue();
				}
			}
		}

		if(StringUtils.isEmpty(result)) {
			result = value;
		}

		Cookie cookie = new Cookie(name, result);
		cookie.setMaxAge(-1);   	//有效期,仅在本浏览器窗口以及本窗口打开的子窗口内有效，关闭窗口后该Cookie即失效
		HttpUtil.getResponse().addCookie(cookie);

		return result;
	}

	/**
	 * 设置指定cookie的值
	 * @param name
	 * @param value
	 */
	protected void setCookie(String name, String value) {
		Cookie cookie = new Cookie(name, value);
		cookie.setMaxAge(-1);   	//有效期,仅在本浏览器窗口以及本窗口打开的子窗口内有效，关闭窗口后该Cookie即失效
		HttpUtil.getResponse().addCookie(cookie);
	}

    /**
     * 渲染失败数据
     *
     * @return result
     */
    public static JsonResult renderError() {
        JsonResult result = new JsonResult();
        result.setSuccess(false);
        result.setStatus(500);
        return result;
    }

    /**
     * 渲染失败数据（带消息）
     *
     * @param msg 需要返回的消息
     * @return result
     */
    public static JsonResult renderError(String msg) {
        JsonResult result = renderError();
        result.setMsg(msg);
        return result;
    }

    /**
     * 渲染失败数据（带消息）
     *
     * @param errCode 错误码
     * @return result
     */
    public static JsonResult renderError(HttpErrCode errCode) {
    	JsonResult result = new JsonResult();
        result.setSuccess(false);
        result.setStatus(errCode.getCode());
        result.setMsg(errCode.getMsg());
        return result;
    }

    /**
     * 渲染失败数据（带消息）
     *
     * @param errCode 错误码
     * @return result
     */
    public static JsonResult renderError(Integer errCode, String msg) {
    	JsonResult result = new JsonResult();
        result.setSuccess(false);
        result.setStatus(errCode);
        result.setMsg(msg);
        return result;
    }

    /**
     * 渲染成功数据
     *
     * @return result
     */
    public static JsonResult renderSuccess() {
        JsonResult result = new JsonResult();
        result.setSuccess(true);
        result.setStatus(200);
        return result;
    }

    /**
     * 渲染成功数据（带信息）
     *
     * @param msg 需要返回的信息
     * @return result
     */
    public static JsonResult renderSuccess(String msg) {
        JsonResult result = renderSuccess();
        result.setMsg(msg);
        return result;
    }

    /**
     * 渲染成功数据（带数据）
     *
     * @param obj 需要返回的对象
     * @return result
     */
    public static JsonResult renderSuccess(Object obj) {
        JsonResult result = renderSuccess();
        result.setObj(obj);
        return result;
    }

    /**
     * 渲染成功数据（带信息和数据）
     * @param msg
     * @param obj
     * @return
     */
    public static JsonResult renderSuccess(String msg,Object obj){
        JsonResult result = renderSuccess();
        result.setMsg(msg);
        result.setObj(obj);
        return result;
    }

    /**
     * 渲染成功数据（带信息）
     *
     * @param msg 需要返回的信息
     * @return result
     */
    public static  HashMap<String, Object>  renderSuccessParams(String data) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("Success", "1");
        map.put("Msg", "参数返回成功！");
        map.put("Data", data);
        return map;
    }

    /**
     * 渲染失败数据（带信息）
     *
     * @param msg 需要返回的信息
     * @return result
     */
    public static  HashMap<String, Object>  renderErroParams(String data) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("Success", "0");
        map.put("Msg", "参数返回失败！");
        map.put("Data", data);
        return map;
    }

    /**
     * 把service层的分页信息，封装为bootstrap table通用的分页封装
     */
    protected <T> PageInfoBT<T> packForBT(Page<T> page) {
        return new PageInfoBT<T>(page);
    }
}
